//int select
//(int nfds, fd_set* readfds, fd_set* writefds, 
//fd_set* exceptfds, struct timeval* timeout)
//nfds是maxfd + 1
//timeout是输出型参数，输入的时候是等待时间，到了则非阻塞返回，在这段时间里阻塞等待
//返回时，返回剩余的时间，该结构体由两部分组成：秒和微秒
//return value：返回有几个fd准备就绪，若小于0，表示给的fd错误，select报错

//fd_set是一个位图，比特位的位置表示fd编号，比特位的内容表示是否关心该文件描述符
//返回时比特位的位置表示fd，内容表示就绪的fd。
//fd_set是一个系统提供的数据类型，大小固定，所以select能同时等待的fd有上限，
//fd_set的大小是1024个比特位，意味这最多能同时关心1024个fd
//所以上面的三个参数表示关心fd的读、写、异常（关心且只关心相应操作）